/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package init;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.Timer;
import net.useobjects.MainActivity;
import net.useobjects.Text;
import net.useobjects.World;
import net.useobjects.geom.Position;
import pack.Ciel;
import pack.Strelec;
import pack.Controller;
import pack.Kamen;
import pack.Strela;

public class OnInit implements MainActivity {

    private World svet;
    private Controller controller;
    private Strelec strelec;
    private Ciel ciel;
    private ArrayList<Kamen> zoznamKamenov;
    private ArrayList<Ciel> zoznamCielov;
    private ArrayList<Strela> zoznamStriel;
    private Kamen kamen;
    private Random rand;
    private final int pocetKamenov = 20;
    private final int pocetCielov = 10;
    private final int maxPolomerKamena = 30;
    private final int polohaStrelcaX = 400;
    private final int polohaStrelcaY = 300;
    private Position pozicia, poziciaStrelca;
    private Timer timer;
    private int delay = 100;
    private int casHry=0;
    private Text text;

    @Override
    public void onInit() {
        svet = new World("hra strelec", 800, 600);
        pozicia = new Position(0, 0); //pomocna premenna pre vytvaranie objektov
        rand = new Random();
        zoznamStriel = new ArrayList<>();
        poziciaStrelca = new Position(polohaStrelcaX, polohaStrelcaY);
        
        

        //vytvor kamene
        zoznamKamenov = new ArrayList<>();
        for (int i = 0; i < pocetKamenov; i++) {
            zoznamKamenov.add(vytvorKamen());
        }

//        for(int i=0;i<20;i++) {
//            zoznamKamenov.add(new Kamen(svet.getRootGroup(),pozicia.set(40*i, 0),40));
//            zoznamKamenov.add(new Kamen(svet.getRootGroup(),pozicia.set(0,40*i),40));
//            zoznamKamenov.add(new Kamen(svet.getRootGroup(),pozicia.set(40*i, 600),40));
//            zoznamKamenov.add(new Kamen(svet.getRootGroup(),pozicia.set(800, 40*i),40));
//        }
        //vytvor ciele
        zoznamCielov = new ArrayList<>();
        for (int i = 0; i < pocetCielov; i++) {

//            do {
//                ciel = null;
                ciel = vytvorCiel();
//            } while (validujUmiestnenieCiela(ciel));

            zoznamCielov.add(ciel);
        }
        controller = new Controller(svet, zoznamKamenov, zoznamStriel);
        strelec = new Strelec(svet, controller, svet.getRootGroup(), poziciaStrelca, 0.0);
        
        vytvorCasovac();
        
//        System.out.println("inicializacia pocet cielov: " + zoznamCielov.size());
    }

    private boolean validujUmiestnenieCiela(Ciel ciel) {
        double radiusCiel = getPolarRadius(ciel.getPositionInRootGroup());

        for (Kamen k : zoznamKamenov) {
            double radiusKamen = getPolarRadius(k.getPositionInRootGroup());
            if ((radiusCiel <= radiusKamen + maxPolomerKamena) && (radiusCiel >= radiusKamen - maxPolomerKamena)) {
                ciel = null;
                return false;//true;
            }
        }
        return true;//false;
    }

    private Kamen vytvorKamen() {
        //opakuj:
        while (true) {

            pozicia = vygenerujPoziciu(pozicia);
            if (pozicia.getX() > poziciaStrelca.getX() - 10 && pozicia.getX() < poziciaStrelca.getX() + 10
                    && pozicia.getY() < poziciaStrelca.getY() - 10 && pozicia.getY() > poziciaStrelca.getY() + 10) {
                continue;
            }
            break;
        }

        kamen = new Kamen(svet.getRootGroup(), pozicia, rand.nextInt(maxPolomerKamena) + 5);

        return kamen;
    }

    private Ciel vytvorCiel() {
        pozicia = vygenerujPoziciu(pozicia);
        ciel = new Ciel(svet.getRootGroup(), pozicia, zoznamKamenov, zoznamStriel,zoznamCielov);
        return ciel;
    }

    private Position vygenerujPoziciu(Position pozicia) {
        int x, y;
        x = rand.nextInt(800);
        y = rand.nextInt(600);
        pozicia.set(x, y);
        return pozicia;
    }

    private double getPolarRadius(Position position) {
        return (Math.sqrt(
                Math.pow(position.getX(), 2.0)
                + Math.pow(position.getY(), 2.0)
        ));
    }

    private void vytvorCasovac() {
        timer = new Timer(delay,new TimerListener());
        //timer.setRepeats(true);
        timer.start();
    }
    
    private class TimerListener implements ActionListener { // vnorena class

        public void actionPerformed(ActionEvent e) {
            casHry +=timer.getDelay();
            
            if( zoznamCielov.size()==0) {
                timer.stop();
                casHry /=1000;
                
                zastavHru();
                String string = new String("hra trvala " + String.valueOf(casHry)+" sekund");
                text = new Text(svet.getRootGroup(),string,400,300);
                
                System.out.println(casHry/1000);
                
            }
        }

        private void zastavHru() {
            
            strelec.setVisible(false);
            strelec = null;
            
            for(Kamen k:zoznamKamenov) {
                k.setVisible(false);
                k=null;
            }
            
//            
        }
    }
}
